/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-基础组件封装层-会话管理-核心依赖
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.boot.session.core;

import com.fasterxml.jackson.core.type.TypeReference;
import com.taipingframework.boot.cache.redis.StandardCacheKey;
import org.springframework.lang.NonNull;
import org.springframework.web.server.WebSession;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public interface ReactiveSessionHandler {

    /**
     * 创建Session [登录]
     */
    Mono<WebSession> createSession(@NonNull String loginName);

    /**
     * 移除Session [注销]
     */
    Mono<Boolean> removeSession();

    /**
     * 暴力移除会话[强制注销/强制下线]
     * <p>
     * 在同一台设备上，可用的终端是有限的，用户切换账号时后端需要主动负责将设备IP+用户空间映射的用户会话给注销掉，
     * 而不是让别人手动退出后重新输入账号、密码后才可以登录。
     * <p>
     * 该方法不应被调用，而应该由前端通过参数`conflictSessionId`主动调用退出登录的接口，然后才能再次调用登录的接口！
     */
    @Deprecated
    Mono<Boolean> removeSessionByForce(@NonNull String conflictSessionId);

    /**
     * 判断当前登录操作是否与已有会话对象冲突
     *
     * @return 返回已经存在的会话对象标识
     */
    Mono<String> checkSessionConflict(@NonNull String loginName);

    /**
     * 获取当前会话标识
     */
    Mono<WebSession> readSession();

    /**
     * 设置属性值
     */
    Mono<Boolean> setAttribute(@NonNull String name, Object value);

    /**
     * 设置属性值
     */
    Mono<Boolean> setAttribute(@NonNull StandardCacheKey cacheKeyEnum, Object value);

    /**
     * 移除属性
     */
    Mono<Long> removeAttribute(@NonNull String name);

    /**
     * 移除属性
     */
    Mono<Long> removeAttribute(@NonNull StandardCacheKey cacheKeyEnum);

    /**
     * 获取属性值
     */
    Mono<String> getAttribute(@NonNull String name);

    /**
     * 获取属性值
     */
    Mono<String> getAttribute(@NonNull StandardCacheKey cacheKeyEnum);

    /**
     * 获取属性值
     */
    <T> Mono<T> getAttribute(@NonNull StandardCacheKey cacheKeyEnum, Class<T> clazz);

    /**
     * 获取属性值
     */
    <T> Mono<T> getAttribute(@NonNull StandardCacheKey cacheKeyEnum, TypeReference<T> type);

    /**
     * 获取所有的属性名列表
     */
    Flux<String> getAttributeNames();

}
